package com.ljh.lottery.common.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.JwtParserBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: Themberfue
 * @date: 2025/4/10 12:17
 * @description:
 */
public class JwtUtil {
    private static final Logger logger = LoggerFactory.getLogger(JwtUtil.class);
    /**
     * 密钥：Base64 编码的密钥
     */
    private static final String SECRET = "zEfbkniJET9+hUeHGqMAE8vmXstx4RvDaAIUn8QsH18=";

    /**
     * 生成安全密钥：将一个 Base64 编码的密钥解码并创建一个 HMAC SHA密钥。
     */
    private static final SecretKey SECRET_KEY = Keys.hmacShaKeyFor(
            Decoders.BASE64.decode(SECRET));

    /**
     * 过期时间(单位: 毫秒)
     */
//    private static final long EXPIRATION = 60 * 60 * 1000;

    /**
     * 生成密钥
     *
     * @param claim 示例：{"id": 12, "name":"张山"}
     * @return 返回生成的 token
     */
    public static String genJwt(Map<String, Object> claim){
        // TODO 签名算法
        return Jwts.builder()
                .setClaims(claim) // * 自定义内容(载荷)
//                .setIssuedAt(new Date()) // * 设置签发时间
//                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION)) // * 设置过期时间
                .signWith(SECRET_KEY) // * 签名算法
                .compact();
    }

    /**
     * 解析 token
     * @param token token
     * @return 解析出来的载荷
     */
    public static Claims parseJWT(String token){
        if (!StringUtils.hasLength(token)){
            return null;
        }
        // TODO 1. 创建解析器, 设置签名密钥
        JwtParserBuilder jwtParserBuilder = Jwts.parserBuilder().setSigningKey(SECRET_KEY);
        Claims claims = null;
        try {
            // TODO 2. 解析 token
            claims = jwtParserBuilder.build().parseClaimsJws(token).getBody();
        }catch (JwtException e){
            // ! 签名验证失败
            logger.error("解析令牌错误, token: {}", token, e);
        }
        return claims;
    }

    /**
     * 从 token 中获取用户ID
     * @param token token
     * @return 用户id
     */
    public static Integer getUserIdFromToken(String token) {
        // TODO 解析 token
        Claims claims = JwtUtil.parseJWT(token);
        if (claims != null) {
            Map<String, Object> userInfo = new HashMap<>(claims);
            return (Integer) userInfo.get("userId");
        }
        return null;
    }
}
